"""
Модуль выполняет функции:
- Получает конфигурацию из файла config.yaml
- Кластеризует объекты методом K-Means согласно конфигурации
- Сохраняет результаты в файл
- Выводит статистические данные в терминал
"""
from swarm_network import clusters
from swarm_network import data
from swarm_network import graph

# Чтение конфигурации и установка параметров генерации
config = data.read_config('config.yaml')
data_directory = config['data_directory']
base_point = config['base_point']
data_filename = config['data_filename']

# Ручное конфигурирование
# data_filename = "data-grid-100-side100000-z1000"
result_filename_objects = f'{data_filename}-results-static-objects'
result_filename_clusters = f'{data_filename}-results-static-clusters'
result_filename_routes = f'{data_filename}-results-static-routes'

count_clusters = 20
base_connections = 3
leaders_connections = 3
SAVE_FILE = False

# Получить данные из файла
df_objects = data.get_data(data_directory, data_filename)

# Кластеризация
df_objects, df_clusters = clusters.clustering(df_objects, count_clusters, base_point)

# Выбор ближайших к базовой станции
df_objects, df_clusters = clusters.set_base_connectors(df_objects, df_clusters, base_connections)

# Создание графа сети
Graph = graph.generate_graph(df_objects, df_clusters, base_point)

# Фильтрация графа сети по количество коннектов между кластерами и базовой станцией
filtered_G = graph.filter_connections(Graph, base_connections, leaders_connections)

# Маршрутизация сети и поиск кратчашего пути
df_objects = graph.short_paths(filtered_G, df_objects)

# Сохранение каналов связи в дата сет
df_clusters, df_routes = graph.routing_stat(filtered_G, df_clusters)

# Сохранение результатов в файл
if SAVE_FILE:
    ## Объекты
    data.save_data(df_objects, data_directory, result_filename_objects)
    ## Кластеры
    data.save_data(df_clusters, data_directory, result_filename_clusters)
    ## Каналы связи
    data.save_data(df_routes, data_directory, result_filename_routes)

# Печать результатов в терминал для объектов
clusters.print_stat(df_objects)

# Печать результатов в терминал для графов
graph.print_stat(filtered_G)
